package com.chunguang.sxt.netty.clinet;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;
import io.netty.util.ReferenceCountUtil;

public class ClientHandler extends ChannelHandlerAdapter {

	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
		try {
			//do something msg
			ByteBuf buf = (ByteBuf)msg;
			byte[] data = new byte[buf.readableBytes()];
			buf.readBytes(data);
			String request = new String(data, "utf-8");
			System.out.println("Client: " + request);
			
//			注意： 我们在读取 bytebuffer里面的 东西的时候，需要释放下。 
//			但是我们在服务端的时候，写入bytebuffer的时候不需要进行释放
		/**
		 * 如果在这里进行 
		 *  ctx.writeandflush(msg)	 就不需要进行release。
		 *  因为再写入的时候，已经对buf进行release
		 *  
		 *  
		 *  还有在 writeandflush 的时候返回对象就是featurechannel对象，这个是异步操作，不会阻塞。
		 *  这就是netty的异步操作
		 */
		
		} finally {
			ReferenceCountUtil.release(msg);
		}
	}

	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
		cause.printStackTrace();
		ctx.close();
	}
}
